/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
// class Solution {
// public:
//     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
//         ListNode* A=headA;
//         ListNode* B=headB;
//         int countA=0,countB=0;
//         while(A)
//         {
//             A=A->next;
//             countA++;
//         }
//         while(B)
//         {
//             B=B->next;
//             countB++;
//         }
//         A=headA;
//         B=headB;
//         int sub=abs(countA-countB);
//         if(countA>countB)
//         {
//             while(sub--)
//             {
//                 A=A->next;
//             }
//         }
//         else
//         {
//             while(sub--)
//             {
//                 B=B->next;
//             }
//         }
//         while(A&&B)
//         {
//             if(A==B) return  A;
//             A=A->next;
//             B=B->next;
            
//         }
//         return nullptr;
//     }
// };


//更加优雅的写法,需要用到数学知识
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* A=headA;
        ListNode* B=headB;
        while(A!=B)
        {
            A=A!=nullptr?A->next:headB;
            B=B!=nullptr?B->next:headA;
        }
        return A;
    }
};
